home *** CD-ROM | disk | FTP | other *** search
- #ifndef __MEMUTILS__
- #define __MEMUTILS__
- #pragma once
-
- #ifndef __MEMORY__
- #include <Memory.h>
- #endif
-
- //------------------------------------------------------------------------------
-
- enum HandleState
- {
- kHDispose = 0x8000, // Auto-dispose
- kHMoveHi = 0x4000, // Move hi in heap
- kHClear = 0x1000, //
- kHCritical = 0x0800, // Allocate from reserve if needed
- kHSysHeap = 0x0400, // Allocate in system heap
- kHTempMem = 0x0200, // Allocate in temp mem
- kHLocked = 0x0080, // -- correspond to HState bits
- kHPurge = 0x0040,
- kHResource = 0x0020,
-
- kHLockHi = kHMoveHi+kHLocked
- };
-
- //------------------------------------------------------------------------------
-
- class CAutoHandle
- {
- protected:
- Handle fHandle;
- HandleState fState;
-
- void _CAutoHandle(Handle h, HandleState desiredState);
-
- public:
- CAutoHandle(Size size, HandleState desiredState);
- CAutoHandle(const void* data, Size size, HandleState desiredState);
- inline CAutoHandle(Handle h, HandleState desiredState)
- {
- _CAutoHandle(h, desiredState);
- }
- ~CAutoHandle();
-
- inline void AutoDispose() { fState = (HandleState) (fState | kHDispose); }
- inline void DontDispose() { fState = (HandleState) (fState & ~kHDispose); }
-
- inline void AdoptedHandle() { fHandle = nil; }
-
- // inline operator const Handle() const { return fHandle; }
- inline operator Handle() { return fHandle; }
-
- inline const void* operator*() const { return *fHandle; }
- inline void* operator*() { return *fHandle; }
- };
-
- //------------------------------------------------------------------------------
-
- class CTempHandle : public CAutoHandle
- {
- public:
- inline CTempHandle(
- Handle h,
- bool lock = false,
- bool moveHi = false)
- : CAutoHandle(h, (HandleState) (kHTempMem | kHDispose
- | (lock ? kHLocked : 0)
- | (moveHi ? kHMoveHi : 0)))
- {
- }
-
- inline CTempHandle(
- const void* data,
- Size size,
- bool lock = false,
- bool moveHi = false)
- : CAutoHandle(data, size, (HandleState) (kHTempMem | kHDispose
- | (lock ? kHLocked : 0)
- | (moveHi ? kHMoveHi : 0)))
- {
- }
-
- inline CTempHandle(
- Size size,
- bool lock = false,
- bool moveHi = false)
- : CAutoHandle(size, (HandleState) (kHTempMem | kHDispose
- | (lock ? kHLocked : 0)
- | (moveHi ? kHMoveHi : 0)))
- {
- }
-
- inline CTempHandle(
- Size size,
- HandleState state)
- : CAutoHandle(size, (HandleState) (kHTempMem | kHDispose | state))
- {
- }
-
- inline CTempHandle(
- const void* data,
- Size size,
- HandleState state)
- : CAutoHandle(data, size, (HandleState) (kHTempMem | kHDispose | state))
- {
- }
-
- ~CTempHandle();
-
- inline Handle Release() // let our handle float when we go out of scope
- {
- fState = (HandleState) (fState & ~(kHDispose|kHLocked));
- return fHandle;
- }
-
- inline void Unlock()
- {
- if (!(fState & kHLocked))
- {
- HUnlock(fHandle);
- }
- else if (qDebug)
- {
- Debugger();
- }
- }
- };
-
- //------------------------------------------------------------------------------
-
- class WithHandleLocked : public CAutoHandle
- {
- public:
- WithHandleLocked(Handle h, bool moveHi = false) : CAutoHandle(h, moveHi ? kHLockHi : kHLocked) {}
- };
-
- //------------------------------------------------------------------------------
-
- void CopyHandle(Handle src, Handle dst);
-
- void BlockZero(void* p, Size size);
-
- //------------------------------------------------------------------------------
-
- #endif // __MEMUTILS__
-